package com.et.util.upload;

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONObject;

import org.apache.commons.io.FileUtils;

import unis.base.util.ValidateUtil;

import com.et.util.constant.Constants;

/**
 * 文件上传/下载操作类
 * @author Administrator
 *
 */
public final class Upload {
    /**
     * 上传文件执行方法(带size)
     * @param size 文件大小，传入MB参数，最大支持30MB
     * @param type 文件类型，传入常量表里的文件类型
     * @return
     */
    @SuppressWarnings("finally")
	public static List<JSONObject> upload(File[] upload,String[] uploadFileName,int size,String type){
    	//将MB换算成字节
    	size = size * 1024 * 1024;
    	List<JSONObject> listJson = new ArrayList<JSONObject>();
    	
        try{
           for (int i = 0; i < upload.length; i++){
        	  JSONObject json  = new JSONObject();
        	  json.put("error", "notError");
        	  //上传的文件名
              String fileName = uploadFileName[i];
              //上传文件大小
              float fileSize = upload[i].length(); 
              //上传文件后缀名
              String fileType = fileName.substring(fileName.lastIndexOf(".")+1);
              //上传文件路径
              String filePath = "";
              /**判断文件大小*/
              if(fileSize > size){
            	  json.put("error", getConfigPath("sizeError"));
            	  listJson.add(json);
            	  return listJson;
              }
              /**判断文件类型*/
              filePath = fileTypePath(type,fileType);
              if(ValidateUtil.isEmpty(filePath)){
            	  json.put("error", getConfigPath("typeError"));
            	  listJson.add(json);
            	  return listJson;
              }
              String realName = UUID.randomUUID().toString()+ getExt(fileName);// 保存的文件名称，使用UUID+后缀进行保存
              File target = new File("D:\\upload/"+filePath, realName);
              FileUtils.copyFile(upload[i], target);
              json.put("name", fileName);
              json.put("path", filePath+"/"+realName);
              json.put("size", fileSize);
              json.put("type", fileType);
              listJson.add(json);
           }
       }catch (Exception e){
    	   e.printStackTrace();
       }
       return listJson;
    }
    
    /**
     * 重载：上传文件执行方法(默认size为10MB)
     * @param size 文件大小，传入MB参数，最大支持30MB
     * @param type 文件类型，传入常量表里的文件类型
     * @return
     */
    @SuppressWarnings("finally")
	public static List<JSONObject> upload(File[] upload,String[] uploadFileName,String type){
    	//将MB换算成字节;
    	int size = 10 * 1024 * 1024;
    	List<JSONObject> listJson = new ArrayList<JSONObject>();
    	
        try{
           for (int i = 0; i < upload.length; i++){
        	  JSONObject json  = new JSONObject();
        	  json.put("error", "notError");
        	  //上传的文件名
              String fileName = uploadFileName[i];
              //上传文件大小
              float fileSize = (int)upload[i].length(); 
              //上传文件后缀名
              String fileType = fileName.substring(fileName.lastIndexOf(".")+1);
              //上传文件路径
              String filePath = "";
              /**判断文件大小*/
              if(fileSize > size){
            	  json.put("error", getConfigPath("sizeError"));
            	  return listJson;
              }
              /**判断文件类型*/
              filePath = fileTypePath(type,fileType);
              if(ValidateUtil.isEmpty(filePath)){
            	  json.put("error", getConfigPath("typeError"));
            	  return listJson;
              }
              String realName = UUID.randomUUID().toString()+ getExt(fileName);// 保存的文件名称，使用UUID+后缀进行保存
              File target = new File("D:\\upload/"+filePath, realName);
              FileUtils.copyFile(upload[i], target);
              json.put("name", fileName);
              json.put("path", filePath+"/"+realName);
              json.put("size", fileSize);
              json.put("type", fileType);
              listJson.add(json);
           }
       }catch (Exception e){
    	   e.printStackTrace();
       }
       return listJson;
    }
    
    /**
     * 判断文件类型合法性
     * @param type 文件类型，传入常量表里的文件类型
     * @param fileType 文件后缀名
     * 
     * @return 根据类型返回上传的路径
     */
    private static String fileTypePath(String type,String fileType){
    	String types[] = new String[10] ;
    	String filePath = "";
    	if(type.equals(Constants.UploadTypeSet.IMAGES)){
    		types = getConfigPath("imagesType").split(",");
    		filePath = getConfigPath("imagesPath");
        }else if(type.equals(Constants.UploadTypeSet.VIDEO)){
        	types = getConfigPath("videoType").split(",");
        	filePath = getConfigPath("videoPath");
        }else if(type.equals(Constants.UploadTypeSet.FILE)){
        	types = getConfigPath("fileType").split(",");
        	filePath = getConfigPath("filePath");
        }
    	for(int i=0;i<types.length;i++){
    		if(types[i].equals(fileType)){
    			return filePath;
 			}
    	}
    	return null;
    }
    
    /**
     * 下载文件
     * @return
     */
    public static HttpServletResponse download(String path, HttpServletResponse response) {
        try {
            // path是指欲下载的文件的路径。
            File file = new File(path);
            // 取得文件名。
            String filename = file.getName();

            // 以流的形式下载文件。
            InputStream fis = new BufferedInputStream(new FileInputStream(path));
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();
            // 清空response
            response.reset();
            // 设置response的Header
            response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));
            response.addHeader("Content-Length", "" + file.length());
            OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/octet-stream");
            toClient.write(buffer);
            toClient.flush();
            toClient.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return response;
    }
    
    public static String getExt(String fileName){
       return fileName.substring(fileName.lastIndexOf("."));
    }

	public static String getConfigPath(String key) {
		return UploadConfigurationRead.getInstance().getConfigItem(key).trim();
	}
}
